﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ConfeccionesJR.Entites;
using ConfeccionesJR.Repository;
using Microsoft.Practices.Unity;

namespace ConfeccionesJR.BussinesLogic
{
    public class VentaBL:IVentaBL
    {
        [Dependency]
        public IVentaRepository ventaDAO { get; set; }

        [Dependency]
        public IDetalleVentaRepository detalleVeDAO { get; set; }

        [Dependency]
        public IProductoRepository productoDAO { get; set; }

        [Dependency]
        public IMaterialRepository materialRepository { get; set; }

        [Dependency]
        public IUnidadMedidaRepository undRepository { get; set; }
        
        public List<VENTA> GetAllFromVentas()
        {
            return ventaDAO.GetAllFromVentas();
        }
        
        public List<VENTA> GetFromVentabyCliente(string cliente)
        {
            return ventaDAO.GetFromVentabyCliente(cliente);
        }
        
        public List<VENTA> GetFromVentabyClienteAndFecha(string cliente, DateTime? fecha)
        {
            return ventaDAO.GetFromVentabyClienteAndFecha(cliente, fecha);
        }

        public VENTA GetFromVentaById(int id)
        {
            return ventaDAO.GetFromVentaById(id);
        }

        public void AddVenta(VENTA venta)
        {
            var msg = "";
            var ok = venta.Validate(out msg);

            if (ok)
            {
                //ValidarStocks(venta);

                ventaDAO.AddVenta(venta);

                #region UpdateStockProducto
                foreach (var item in venta.DETALLEVENTAs)
                {
                    var producto = productoDAO.GetFromProductoById(item.ProductoId);
                    producto.UNIDAD_MEDIDAs = undRepository.GetFromUnidadMedidaById(producto.undMedidaId);

                    producto.Stock = producto.Stock - item.Cantidad;
                    productoDAO.UpdateSoloProducto(producto);
                }
                #endregion
            }
            else
            {
                throw new Exception(msg);
            }
        }

        //private void ValidarStocks(VENTA venta)
        //{
        //    foreach (var item in venta.DETALLEVENTAs)
        //    {
        //        var producto = productoDAO.GetFromProductoById(item.ProductoId);
        //        var und = undRepository.GetFromUnidadMedidaById(producto.undMedidaId);
               
        //            if (item.Cantidad > producto.Stock)
        //            {
        //                throw new Exception(string.Format("No hay Stock suficiente para el producto {0}," +
        //                                  " solo quedan {1} {2}", producto.Descripcion, producto.Stock, und.Descripcion ));
        //            }
        //    }
        //}

        public void CancelarVenta(int id)
        {
            ventaDAO.CancelarVenta(id);
        }


        public List<VENTA> GetFromVentasbyFechaAndClienteAndFactura(DateTime? fec1, DateTime? fec2, string cliente, bool factura)
        {
            return ventaDAO.GetFromVentasbyFechaAndClienteAndFactura(fec1, fec2, cliente, factura);
        }

        public List<VENTA> GetFromVentasbyFechaAndClienteAndBoleta(DateTime? fec1, DateTime? fec2, string cliente)
        {
            return ventaDAO.GetFromVentasbyFechaAndClienteAndBoleta(fec1, fec2, cliente);
        }

        public List<VENTA> GetFromVentasbyFechaAndCliente(DateTime? fec1, DateTime? fec2, string cliente)
        {
            return ventaDAO.GetFromVentasbyFechaAndCliente(fec1, fec2, cliente);
        }
    }
}
